package com.chenyue.cm.tecentCloud;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.chenyue.cm.utils.OkHttpUtils;
import com.chenyue.cm.utils.im.util.ImConfig;
import com.chenyue.cm.utils.im.util.TLSSigAPIv2;
import okhttp3.FormBody;
import okhttp3.RequestBody;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author libingxing
 */
@Service
public class RoomServiceUtil {

    /**
     * 通过用户id,生成 UserSig 签名
     * 1、采用服务端计算 UserSig 的方案，可以最大限度地保障计算 UserSig 用的密钥不被泄露，因为攻破一台服务器的难度要高于逆向一款 App。具体的做法如下：
     * 2、您的 App 在调用 SDK 的初始化函数之前，首先要向您的服务器请求 UserSig。
     * 3、您的服务器根据 SDKAppID 和 UserID 计算 UserSig，计算源码见文档前半部分。
     * 4、服务器将计算好的 UserSig 返回给您的 App。
     * 5、您的 App 将获得的 UserSig 通过特定 API 传递给 SDK。
     * 6、SDK 将 SDKAppID + UserID + UserSig 提交给腾讯云服务器进行校验。
     * 7、腾讯云校验 UserSig，确认合法性。
     * 8、校验通过后，会向 TRTCSDK 提供实时音视频服务
     *
     * @return
     */
    public String getUserSig(String userId) {
        TLSSigAPIv2 signGen = new TLSSigAPIv2(ImConfig.SDK_APP_ID, ImConfig.SECRET_KEY);
        return signGen.genSig(userId + "", 604800);
    }

    /**
     * 登录账号
     * 登录直播房间管理后台获取登录票据token
     *
     * @param userId
     * @return userID 用户ID（业务确保唯一性）
     * token  用户登录票据（后续其它请求需要带上用于对用户鉴权）
     * @throws Exception
     */
    public JSONObject login(String userId) throws Exception {
        RequestBody param = new FormBody.Builder().build();
        Long sdkAppID = ImConfig.SDK_APP_ID;
        //获取签名
        String userSig = getUserSig(userId);
        String url = "https://liveroom.qcloud.com/weapp/live_room/login?sdkAppID=" + sdkAppID + "&userID=" + userId + "&userSig=" + userSig;
        String jsonStr = OkHttpUtils.doPost(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        String token = result.getString("token");
        return result;
    }

    /**
     * 向后台请求用于直播推流用的推流地址
     *
     * @param userId
     * @return
     * @throws Exception
     */
    public JSONObject getAnchorUrl(String userId, String token) throws Exception {
        String url = "https://liveroom.qcloud.com/weapp/live_room/get_anchor_url?token=" + token + "&userID=" + userId;
        Map<String, Object> map = new HashMap<>();
        map.put("userID", userId);
        String param = JSON.toJSONString(map);
        String jsonStr = OkHttpUtils.doPostJson(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        return result;
    }

    /**
     * 创建直播房间
     *
     * @param userId   必填
     * @param token    必填
     * @param roomInfo 必填 房间信息（可以是json格式的字符串，用于存放多个信息字段，后台不会修改该字段）
     * @param roomID   选填
     * @return
     * @throws Exception
     */
    public JSONObject createRoom(String userId, String token, String roomInfo, String roomID) throws Exception {
        String url = "https://liveroom.qcloud.com/weapp/live_room/create_room?token=" + token + "&userID=" + userId;
        Map<String, Object> map = new HashMap<>();
        map.put("userID", userId);
        map.put("roomInfo", roomInfo);
        map.put("roomID", roomID);
        String param = JSON.toJSONString(map);
        String jsonStr = OkHttpUtils.doPostJson(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        return result;
    }

    /**
     * 销毁直播房间
     *
     * @param userId 必填
     * @param token
     * @param roomID 必填
     * @return
     * @throws Exception
     */
    public JSONObject destroyRoom(String userId, String token, String roomID) throws Exception {
        String url = "https://liveroom.qcloud.com/weapp/live_room/destroy_room?token=" + token + "&userID=" + userId;
        Map<String, Object> map = new HashMap<>();
        map.put("userID", userId);
        map.put("roomID", roomID);
        String param = JSON.toJSONString(map);
        String jsonStr = OkHttpUtils.doPostJson(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        return result;
    }

    /**
     * 获取直播房间列表
     *
     * @param userId
     * @param token
     * @param cnt
     * @param index
     * @return
     * @throws Exception
     */
    public JSONObject getRoomList(String userId, String token, String cnt, String index) throws Exception {
        String url = "https://liveroom.qcloud.com/weapp/live_room/get_room_list?token=" + token + "&userID=" + userId;
        Map<String, Object> map = new HashMap<>();
        map.put("cnt", cnt);
        map.put("index", index);
        String param = JSON.toJSONString(map);
        String jsonStr = OkHttpUtils.doPostJson(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        return result;
    }

    /**
     * 获取直播房间信息
     *
     * @param userId
     * @param token
     * @param roomID
     * @return
     * @throws Exception
     */
    public JSONObject getAnchors(String userId, String token, String roomID) throws Exception {
        String url = "https://liveroom.qcloud.com/weapp/live_room/get_anchors?token=" + token + "&userID=" + userId;
        Map<String, Object> map = new HashMap<>();
        map.put("roomID", roomID);
        String param = JSON.toJSONString(map);
        String jsonStr = OkHttpUtils.doPostJson(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        return result;
    }

    /**
     * 加入直播间成为主播/小主播
     *
     * @param userID
     * @param token
     * @param roomID
     * @param userName   用户名称
     * @param pushURL    用户推流地址
     * @param userAvatar 用户头像链接地址
     * @return
     * @throws Exception
     */
    public JSONObject addAnchor(String userID, String token, String roomID, String userName, String pushURL, String userAvatar) throws Exception {
        String url = "https://liveroom.qcloud.com/weapp/live_room/add_anchor?token=" + token + "&userID=" + userID;
        Map<String, Object> map = new HashMap<>();
        map.put("roomID", roomID);
        map.put("userID", userID);
        map.put("userName", "");//用户名称
        map.put("pushURL", "");//用户推流地址
        map.put("userAvatar", "");//用户头像链接地址
        String param = JSON.toJSONString(map);
        String jsonStr = OkHttpUtils.doPostJson(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        return result;
    }

    /**
     * 主播退出直播间
     *
     * @param userID
     * @param token
     * @param roomID
     * @return
     * @throws Exception
     */
    public JSONObject deleteAnchor(String userID, String token, String roomID) throws Exception {
        String url = "https://liveroom.qcloud.com/weapp/live_room/delete_anchor?token=" + token + "&userID=" + userID;
        Map<String, Object> map = new HashMap<>();
        map.put("roomID", roomID);
        map.put("userID", userID);
        String param = JSON.toJSONString(map);
        String jsonStr = OkHttpUtils.doPostJson(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        return result;
    }

    /**
     * 直播间主播上报心跳
     *
     * @param userID
     * @param token
     * @param roomID
     * @return
     * @throws Exception
     */
    public JSONObject anchorHeartbeat(String userID, String token, String roomID) throws Exception {
        String url = "https://liveroom.qcloud.com/weapp/live_room/anchor_heartbeat?token=" + token + "&userID=" + userID;
        Map<String, Object> map = new HashMap<>();
        map.put("roomID", roomID);
        map.put("userID", userID);
        String param = JSON.toJSONString(map);
        String jsonStr = OkHttpUtils.doPostJson(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        return result;
    }

    /**
     * 登出账号
     *
     * @param userID
     * @param token
     * @param roomID
     * @return
     * @throws Exception
     */
    public JSONObject logout(String userID, String token, String roomID) throws Exception {
        String url = "https://liveroom.qcloud.com/weapp/live_room/logout?token=" + token + "&userID=" + userID;
        Map<String, Object> map = new HashMap<>();
        map.put("roomID", roomID);
        map.put("userID", userID);
        String param = JSON.toJSONString(map);
        String jsonStr = OkHttpUtils.doPostJson(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        return result;
    }


    public static void main(String[] args) throws IOException {
        String userID = "lili";
        String token = "852ffcbec68dbc70b59d4b08ba9b3042*1400516497";
        String url = "https://liveroom.qcloud.com/weapp/live_room/get_anchor_url?token=" + token + "&userID=" + userID;
//        String url = "https://liveroom.qcloud.com/weapp/live_room/get_anchor_url?userID="+userID+"&token="+token;
//        String url = "https://liveroom.qcloud.com/weapp/live_room/get_anchor_url?userID=lili&token=852ffcbec68dbc70b59d4b08ba9b3042*1400516497";

        Map<String, Object> map = new HashMap<>();
        map.put("userID", userID);
        String param = JSON.toJSONString(map);
        String jsonStr = OkHttpUtils.doPostJson(url, param);

//        String jsonStr = OkHttpUtils.doPost(url, param);
        JSONObject result = JSON.parseObject(jsonStr);
        System.out.println(result);

    }


}
